package com.liy.teaching;


import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;


/**
 *
 *   布隆过滤器判断 不存在  准确率100%
 *
 *   布隆过滤器判断 存在    准确率不是100%, 也就是说存在误差,不准确
 *
 *
 *   可以判断某样东西一定不存在
 *   或者
 *   可以判断某样东西可能存在
 *
 */
public class RedissonBloomFilter {

    /**
     * 预计要插入多少数据
     */
    private static int size = 10000; //一万


    /**
     * 期望的误判率
     */
    private static double fpp = 0.01;


    public static void main(String[] args) {

        Config config = new Config();
        config.useSingleServer().setAddress("redis://docker:6379");
        //config.useSingleServer().setPassword("1234");

        //构造 Redisson
        RedissonClient redisson = Redisson.create(config);

        // 创建RedisBloomFilter
        RBloomFilter<String> redisBloomFilter = redisson.getBloomFilter("phoneList");


        //初始化布隆过滤器：预计元素为10000L (一万), 误差率为 0.01
        redisBloomFilter.tryInit(size, fpp);


        // 插入一百万样本数据
        for (int i = 0; i < size; i++) {  // 从 0 ~ 10000 (不包含 10000)
            redisBloomFilter.add(String.valueOf(i));
        }


        // 用另外 1000 测试数据，测试误判率
        int count = 0;

        for (int i = size; i < size + 1000; i++) {  //  10000 ~ 11000 (不包含 11000)
            if ( redisBloomFilter.contains(String.valueOf(i)) ) {
                count++;
                //  System.out.println(i + "误判了");
            }
        }

        System.err.println("------总共的误判数:" +  count);

        redisson.shutdown();
    }
}

